﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>"Обработка нажатия ESC или . . ."</title>
<meta http-equiv="Content-Type" Content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../styles/styles.css">
<link REV="made" href="mailto:vmoshninov@newmail.ru">
<meta name="Author" content="Vasily V. Moshninov">
<meta name="description" content="Обработка нажатия ESC или . . .">
<script language="JavaScript" src='../links.js' type="text/javascript"></script>
</head>
<body>

<a name="top"></a>
<h1>"Обработка нажатия ESC или . . ."</h1>
<div class=navbar>
<a href="../index.html">главная</a> |
<a href="index.html">статьи</a> |
<a href="escape.html">статья</a>
</div>

<div align=right><code>
<code>Василий Мошнинов <a href="mailto:Vasily%20V%2E%20Moshninov%20<vmoshninov@newmail.ru>?subject=Articles">
<img src="../../images/email.gif" border="0" alt="[vmoshninov@newmail.ru]" width="16" height="16" align="middle">vmoshninov@newmail.ru</a>
</code></div>
<hr color="#003399">

<p class=plain>Я бы предложил переписать функцию проверки на ESC
по-другому. В своё время у меня были замечания по поводу того, что
плагин ProxyFtp чистит буфер и нельзя делать &laquo;упреждающие нажатия&raquo; :)) клавиш. Поэтому такая
функция была мной переписана вот так:

<pre class=code>function CheckForKey(vKey: word): boolean;
const
  DELTA = 16;
Type
  TInputRecArr = array[0..Pred(MaxInt div SizeOf(TInputRecord))] of TInputRecord;
Var
  Console: THandle;
  InputRec: ^TInputRecArr;
  InputSize: DWORD;
  ReadSuccess: boolean;
  ReadCnt,i: DWORD;
Begin
  result:= false;
  Console:= GetStdHandle(STD_INPUT_HANDLE);
  InputSize:= 0;
  InputRec:= nil;

  try
    repeat
      Inc(InputSize, DELTA);
      MemRealloc(InputRec,InputSize*SizeOf(TInputRecord));
      ReadSuccess:= PeekConsoleInput(Console,InputRec^[0],InputSize,ReadCnt);
    until (not ReadSuccess) or (ReadCnt &lt; InputSize);
    if ReadSuccess and (ReadCnt &gt; 0) then
    begin
      for i:= 0 to Pred(ReadCnt) do
        if (InputRec^[i].EventType = KEY_EVENT) and
           (InputRec^[i].Event.KeyEvent.bKeyDown) and
           (InputRec^[i].Event.KeyEvent.wVirtualKeyCode = vKey) then
        begin
         result:= true;
         ReadConsoleInput(Console,InputRec^[0],Succ(i),ReadCnt);
         Break;
        end; { if }
    end; { if }
  finally
    MemRealloc(InputRec,0);
  end;
end;</pre>

<p class=plain>Эта функция не чистит буфер клавиатуры, если искомого кода там нет.<br><br><br></p>

<p class=plain>Вариант функции на C/C++: </div>

<pre class=code>BOOL CheckForKey(WORD vKey)
{
  INPUT_RECORD *InputRec;
  DWORD NumberOfEvents, ReadCnt,i;
  BOOL result = FALSE;
  HANDLE Console = GetStdHandle(STD_INPUT_HANDLE);

  if(GetNumberOfConsoleInputEvents(Console,&amp;NumberOfEvents))
  {
    if((InputRec=(INPUT_RECORD *)GlobalAlloc(GPTR,
                             NumberOfEvents*sizeof(INPUT_RECORD))) != NULL)
    {
      if(PeekConsoleInput(Console,InputRec,NumberOfEvents,&amp;ReadCnt))
        if(ReadCnt &lt;= NumberOfEvents)
          for(i=0; i &lt; NumberOfEvents; ++i)
          {
            if (InputRec[i].EventType == KEY_EVENT &amp;&amp;
                InputRec[i].Event.KeyEvent.bKeyDown &amp;&amp;
                InputRec[i].Event.KeyEvent.wVirtualKeyCode == vKey)
            {
              result=TRUE;
              if(i &gt; 0)
                ReadConsoleInput(Console,InputRec,i,&amp;ReadCnt);
              break;
            }
          }
      GlobalFree((HGLOBAL)InputRec);
    }
  }
  return result;
}</pre>

<div align=right><code>
<br>&nbsp;<br>
15.04.2000
</code></div>
<div class=seecont><a href="#top">наверх</a></div>
</body>
</html>